package com.reliable.framework.utils;

import com.reliable.api.dto.user.ReliableUserLite;
import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
public class JwtUtils {

    // 密钥（建议从配置文件中读取）

    @Value("${token.secret}")
    private String secret;
    private static String SECRET;


    @Value("${token.expireTime}")
    private long expireTime; // 注意：不能是 static

    private static long EXPIRATION;


    @PostConstruct
    public void init() {
        SECRET = secret; // 将注入的值赋给静态变量
        EXPIRATION=expireTime;
    }


    // 生成 token
    public static String generateToken(ReliableUserLite loginUser) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", loginUser.getId());
        claims.put("username", loginUser.getUserName());
        claims.put("userType", loginUser.getUserType()); // 👈 关键！存入用户类型
        claims.put("city", loginUser.getCity()); // 存入城市信息

        return Jwts.builder()
                .setClaims(claims)
                .setSubject(loginUser.getAccount())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
    }

    // 解析 token 获取用户名
    public static String parseUsername(String token) {
        return (String) getClaim(token).get("username");
    }

    // 解析 token 获取用户ID
    public static Long parseUserId(String token) {
        Object userId = getClaim(token).get("userId");
        if (userId instanceof Number) {
            return ((Number) userId).longValue();
        } else {
            throw new IllegalArgumentException("Invalid user ID in token");
        }
    }


    // 解析 token 获取角色
    public static String parseRole(String token) {
        return (String) getClaim(token).get("role");
    }

    // 解析 token 获取城市
    public static String parseCity(String token) {
        return (String) getClaim(token).get("city");
    }

    // 获取所有 Claims
    private static Claims getClaim(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody();
    }



    /**
     * 解析 Token 获取用户名
     */
    public static String parseAccount(String token) {
        return getClaims(token).getSubject();
    }


    /**
     * 解析 Token 获取所有 Claims
     */
    public static Claims getClaims(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (JwtException e) {
            throw new RuntimeException("Token 解析失败: " + e.getMessage());
        }
    }

    /**
     * 获取当前登录用户信息（用于 Service 层）
     * 若无有效 Token，则返回 null 而非抛异常
     */
    public static ReliableUserLite getCurrentUser() {
        String token = TokenContext.getToken(); // 从 ThreadLocal 获取 token
        if (token == null || isTokenExpired(token)) {
            return null; // 👈 修改点：返回 null 而非抛异常
        }
        return parseUserFromToken(token);
    }


    /**
     * 判断 Token 是否过期
     */
    public static boolean isTokenExpired(String token) {
        try {
            return getClaims(token).getExpiration().before(new Date());
        } catch (JwtException e) {
            return true;
        }
    }



    /**
     * 从 token 解析出用户信息
     */
    public static ReliableUserLite parseUserFromToken(String token) {
        ReliableUserLite user = new ReliableUserLite();
        user.setId(parseUserId(token));
        user.setAccount(parseAccount(token));
        user.setUserName(parseUsername(token));
        user.setCity(parseCity(token)); // 从 token 中读取城市

        // 👇 新增：从 token 中读取 userType
        Object userTypeObj = getClaim(token).get("userType");
        if (userTypeObj instanceof Number) {
            user.setUserType(((Number) userTypeObj).longValue());
        } else {
            user.setUserType(2L); // 默认为普通用户（安全兜底）
        }

        return user;
    }

    /**
     * 从请求头中提取 token（示例方法，需根据实际框架调整）
     */
    private String extractTokenFromRequest() {

        return TokenContext.getToken();
    }
}